/**
 * nextTick
 * 在 Node.js 中，process.nextTick() 方法的作用是将一个回调函数放到当前事件循环的下一个"tick"中去执行。
 * 这意味着它会在当前操作完成后、事件循环继续进行之前执行这个回调函数。
 * 使用 process.nextTick() 可以确保无论何时添加函数，都会在当前事件循环的所有同步代码执行完毕后、任何I/O操作（或定时器）之前执行这个函数。
 * 这个特性使得 process.nextTick() 非常适合处理需要尽快执行但又不想阻塞后续I/O操作的情况。
 * 它常用于处理异步操作的结果，或在事件循环的当前阶段结束前，调整内部对象的状态。
 * 可以理解成nextTick也是一种微任务，但是比Promise.then和catch更早执行
 */

/**
 * 微任务执行优先级
 * 1. process.nextTick （若环境中有，如node环境中有，但是浏览器环境没有）
 * 2. Promise.then/catch/final
 * 3. MutationObserver （浏览器环境中有，但是node环境中没有）
 */

/**
 * 宏任务执行优先级（通常版）
 * 1.javascript同步代码 在微任务之前执行
 * 2.setTimeout/setInterval
 * 3.setImmediate
 * 其中setTimeout/setInterval的执行顺序是不确定的，取决于系统性能和传入的时间参数
 * setTimeout/setInterval传入的时间参数很大时，可能会被放到setImmediate之后执行
 */

// 简单示例：
console.log('开始')

setImmediate(() => {
  console.log('setImmediate 回调')
})

setTimeout(() => {
  console.log('setTimeout 回调')
}, 0)

new Promise((resolve, reject) => {
  console.log('promise')
  resolve()
})
  .then(() => {
    console.log('promise 回调')
  })
  .then(() => {
    console.log('promise 回调2')
  })

process.nextTick(() => {
  console.log('nextTick 回调')
})

console.log('结束')

// 输出顺序将会是：
// 开始
// promise
// 结束
// nextTick 回调
// promise 回调
// promise 回调2
// setTimeout 回调
